#include <math.h>
#include "func_math.h"

/*圆孔屏，temp初始图片，Im_W图片宽，Im_H图片高，R孔半径
* o_x孔相对中心水平位移，o_y孔相对中心垂直位移
* fac_hol_rel孔实部透过系数,fac_hol_img孔虚部透过系数
* fac_scrn_rel屏实部透过系数,fac_scrn_img屏虚部透过系数
*/
void screen_circ(double *temp,int Im_W,int Im_H,int R,int o_x,int o_y,double fac_hol_rel,double fac_hol_img,double fac_scrn_rel,double fac_scrn_img)
{
	int i,j;
	for(i=0 ; i<Im_H ; i++)
	{
		for(j=0 ; j<Im_W ; j++)
		{
			if((sqrt((i-(Im_H/2.0-o_y))*(i-(Im_H/2.0-o_y))+(j-(Im_W/2.0-o_x))*(j-(Im_W/2.0-o_x)))) <= R-1)
			{
				(*(temp+i*Im_W*2+j*2+0)) *= fac_hol_rel;
				(*(temp+i*Im_W*2+j*2+1)) *= fac_hol_img;
			}
			else
			{
				(*(temp+i*Im_W*2+j*2+0)) *= fac_scrn_rel;
				(*(temp+i*Im_W*2+j*2+1)) *= fac_scrn_img;
			}
		}
	}
}
/*矩孔屏,temp初始图片，Im_W图片宽，Im_H图片高，hol_w孔宽，hol_h孔高
* o_x孔相对中心水平位移，o_y孔相对中心垂直位移
* fac_hol_rel孔实部透过系数,fac_hol_img孔虚部透过系数
* fac_scrn_rel屏实部透过系数,fac_scrn_img屏虚部透过系数
*/
void screen_rec(double *temp,int Im_W,int Im_H,int hol_w,int hol_h,int o_x,int o_y,double fac_hol_rel,double fac_hol_img,double fac_scrn_rel,double fac_scrn_img)
{
	int i,j;
	for(i=0 ; i<Im_H ; i++){
		for(j=0 ; j<Im_W ; j++)
		{
			if(i>=(Im_H/2-o_y)-hol_h/2+1 && i<(Im_H/2-o_y)+hol_h/2 && j>=(Im_W/2-o_x)-hol_w/2+1 && j<(Im_W/2-o_x)+hol_w/2)
			{
				(*(temp+i*Im_W*2+j*2+0)) *= fac_hol_rel;
				(*(temp+i*Im_W*2+j*2+1)) *= fac_hol_img;
			}
			else
			{
				(*(temp+i*Im_W*2+j*2+0)) *= fac_scrn_rel;
				(*(temp+i*Im_W*2+j*2+1)) *= fac_scrn_img;
			}
		}
	}
}
/*平面透过屏，temp初始图片，Im_W图片宽，Im_H图片高
* fac_rel实部透过系数,fac_img虚部透过系数
*/
void screen_plate(double *temp,int Im_W,int Im_H,double fac_rel,double fac_img)
{
	int i,j;
	for(i=0 ; i<Im_H ; i++);
	{
		for(j=0 ; j<Im_W ; j++)
		{
			(*(temp+i*Im_W*2+j*2+0)) *= fac_rel;
			(*(temp+i*Im_W*2+j*2+1)) *= fac_img;
		}
	}
}
/*函数透过率屏：给出实部与虚部的二元函数（无参），对矩阵元实行变换
* f_rel实部变换函数指针，f_img虚部变换函数指针
* 以图片左下角为原点
*/
void screen_func2(double *temp,int Im_W,int Im_H,double (*f_rel)(double x , double y),double (*f_img)(double x,double y))
{
	int i,j;
	for(i=0 ; i<Im_H ; i++)
	{
		for(j=0 ; j<Im_W ; j++)
		{
			(*(temp+i*Im_W*2+j*2+0)) *= (*f_rel)(j,i);
			(*(temp+i*Im_W*2+j*2+1)) *= (*f_img)(j,i);

		}
	}
}
/*二维三角透过率网屏
* Tx_rel,Ty_rel,Tx_img,Ty_img实虚部三角波周期
* min_rel,max_rel,min_img,max_img实虚部调制上下限
*/
void screen_grid(double *temp,int Im_W,int Im_H,double Tx_rel,double Ty_rel,double min_rel,double max_rel,
	                                            double Tx_img,double Ty_img,double min_img,double max_img)
{
	int i,j;
	for(i=0 ; i<Im_H ; i++)
	{
		for(j=0 ; j<Im_W ; j++)
		{
			(*(temp+i*Im_W*2+j*2+0)) *= triangle_2(j , i , Tx_rel , Ty_rel , min_rel , max_rel);
			(*(temp+i*Im_W*2+j*2+1)) *= triangle_2(j , i , Tx_img , Ty_img , min_img , max_img);
		}
	}
}
//半色调屏（模低于阀值的矩阵元置零
void screen_half(double *temp,int Im_W,int Im_H,double limit)
{
	int i,j;
	for(i=0 ; i<Im_H ; i++)
	{
		for(j=0 ; j<Im_W ; j++)
		{
			if(sqrt((*(temp+i*Im_W*2+j*2+0))*(*(temp+i*Im_W*2+j*2+0))+(*(temp+i*Im_W*2+j*2+1))*(*(temp+i*Im_W*2+j*2+1))) < limit)
				(*(temp+i*Im_W*2+j*2+0))=(*(temp+i*Im_W*2+j*2+1))=0.0;
		}
	}
}